<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>03_异常处理-异常的捕获方式</title>
  <!-- 
  在 JavaScript 中，异常的捕获是通过  `try...catch`  语句实现的。异常捕获机制允许开发者处理运行时错误，防止程序崩溃。
  1. 基本语法
  `try...catch`  语句的基本结构如下：
  try {
      // 可能抛出错误的代码
  } catch (error) {
      // 处理错误的代码
  }
  -  `try`  块中放置可能会抛出异常的代码。
  -  `catch`  块用于捕获和处理  `try`  块中抛出的异常。

  2. 示例代码
  以下是一个简单的示例，展示了如何使用  `try...catch`  捕获异常：
  function divide(a, b) {
      if (b === 0) {
          throw new Error("Division by zero is not allowed.");
      }
      return a / b;
  }

  try {
      console.log(divide(10, 0)); // 这将抛出错误
  } catch (error) {
      console.error("Caught an error:", error.message); // 捕获并处理错误
  }
  3. 捕获特定错误
  在  `catch`  块中，可以根据需要处理特定类型的错误。虽然 JavaScript 不支持直接捕获特定类型的错误，但可以通过条件判断来实现。
  try {
      // 可能抛出不同类型错误的代码
  } catch (error) {
      if (error instanceof TypeError) {
          console.error("TypeError occurred:", error.message);
      } else if (error instanceof ReferenceError) {
          console.error("ReferenceError occurred:", error.message);
      } else {
          console.error("An unexpected error occurred:", error.message);
      }
  }
  4. finally 语句
  `finally`  语句用于定义无论是否发生错误都要执行的代码。它通常用于清理操作，例如关闭文件或释放资源。
  try {
      // 可能抛出错误的代码
  } catch (error) {
      console.error("An error occurred:", error.message);
  } finally {
      console.log("This will always run.");
  }
  5. 异步错误捕获

  在处理异步操作时，可以使用  `try...catch`  结合  `async/await`  来捕获错误：
  async function fetchData() {
      try {
          const response = await fetch('https://api.example.com/data');
          if (!response.ok) {
              throw new Error("Network response was not ok");
          }
          const data = await response.json();
          return data;
      } catch (error) {
          console.error("Error fetching data:", error.message);
      }
  }
  6. 总结

  -  `try...catch`  语句：用于捕获和处理运行时错误，防止程序崩溃。
  -  `throw`  语句：可以手动抛出异常，以便在  `catch`  块中处理。
  -  `finally`  语句：用于执行清理代码，无论是否发生错误。
  - 异步错误捕获： `async/await`  结合  `try...catch`  可以有效捕获异步操作中的错误。
  -->
</head>
<body>

  <script>

    // try...catch...finally
    try {
      // 可能会出错的代码
      console.log('try...')
      throw new Error('抛出异常')
      console.log('try...')
    } catch (e) {
      // 出错后执行的代码
      console.log('catch...')
      console.log(e)
    } finally {
      // 无论是否出错都会执行的代码
      console.log('finally...')
    }

  </script>
  
</body>
</html>